// K好数：动态规划之递推法
#include <iostream>

using namespace std;

int main(int argc, char *argv[]) {
	int K, L;
	cin >> K >> L;
	
	// 长度为x的序列，其最后一位数字为y的K好数个数
	// 以尾数作为分组
	long long dp[L+1][K];
	
	// 全部初始化成0
	memset(dp, 0, sizeof(long long)*(L+1)*(K));
	
	// 首位，只有1～k-1的个数是1
	for (int i=0; i<K; i++) { 
		// 只有一个数字，这个数字不能为0
		if (i==0) {
			dp[1][i] = 0;
		} else {
			dp[1][i] = 1; 
		}
	}
	
	
	// 从长度为2开始递推计算，直到计算出长度为L的所有K好数
	// 以尾数作为分组
	// dp[i][j] = dp[i-1][p], 0<p<k且p!=j-1且p!=j+1
	for (int i=2; i<=L; ++i) {
		for (int j=0; j<K; ++j) {
			for (int p=0; p<K; ++p) {
				if (p!=(j-1) && p!=(j+1)) { 
					dp[i][j] += dp[i-1][p]; 
					dp[i][j] %= 1000000007; 
				}
			}
		}
	}
	
	long long answer = 0;
	
	// 把所有长度为L的K好数，累加起来
	for (int i=0; i<K; ++i) { 
		answer += dp[L][i];  
		answer %= 1000000007; 
	}
	
	cout << answer << endl;
	
	return 0;
}